package com.yyk.yykywd.mvvm.base

import android.annotation.SuppressLint
import android.content.Context
import android.os.Handler
import android.os.Message
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.yyk.yykywd.base.BaseActivity
import com.yyk.yykywd.mvvm.entity.JsonBean
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader
import java.util.*

/**
 * 文件描述：
 * Created by guo on 2019-11-21.
 */
abstract class LoadRegionData : BaseActivity() {
    /**
     * 省市级选择器
     */
    protected var province_id = 0
    protected var county_id: String? = null
    protected var city_id: String? = null
    protected var options1Items: ArrayList<JsonBean> = ArrayList()
    protected val options2Items = ArrayList<ArrayList<String>>()
    protected val options3Items = ArrayList<ArrayList<ArrayList<String>>>()

    protected var index1Items: ArrayList<JsonBean> = ArrayList()
    protected val index2Items = ArrayList<ArrayList<String>>()
    protected val index3Items = ArrayList<ArrayList<ArrayList<String>>>()

    private var thread: Thread? = null
    protected val MSG_LOAD_DATA = 0x0001
    private val MSG_LOAD_SUCCESS = 0x0002
    private val MSG_LOAD_FAILED = 0x0003

    protected var isLoaded = false

    @SuppressLint("HandlerLeak")
    protected val mHandler: Handler = object : Handler() {
        override fun handleMessage(msg: Message) {
            when (msg.what) {
                MSG_LOAD_DATA -> if (thread == null) { //如果已创建就不再重新创建子线程了
                    thread = Thread(Runnable {
                        // 子线程中解析省市区数据
                        initJsonData()
                    })
                    thread?.start()
                }
                MSG_LOAD_SUCCESS ->
                    isLoaded = true
                MSG_LOAD_FAILED -> {
                }
            }
        }
    }

    fun getJson(context: Context, fileName: String?): String {
        val stringBuilder = StringBuilder()
        try {
            val assetManager = context.assets
            val bf = BufferedReader(InputStreamReader(
                    assetManager.open(fileName)))
            var line: String?
            while (bf.readLine().also { line = it } != null) {
                stringBuilder.append(line)
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
        return stringBuilder.toString()
    }

    private fun initJsonData() { //解析数据
        /**
         * 注意：assets 目录下的Json文件仅供参考，实际使用可自行替换文件
         * 关键逻辑在于循环体
         *
         */
        val JsonData = getJson(this, "provincezk.json") //获取assets目录下的json文件数据
        val jsonBean = parseData(JsonData) //用Gson 转成实体
        /**
         * 添加省份数据
         *
         * 注意：如果是添加的JavaBean实体，则实体类需要实现 IPickerViewData 接口，
         * PickerView会通过getPickerViewText方法获取字符串显示出来。
         */
        /**
         * 添加省份数据
         *
         * 注意：如果是添加的JavaBean实体，则实体类需要实现 IPickerViewData 接口，
         * PickerView会通过getPickerViewText方法获取字符串显示出来。
         */
        options1Items = jsonBean
        index1Items = jsonBean
        for (i in jsonBean.indices) { //遍历省份
// 这里是显示 在UI 上的参数
            val CityList = ArrayList<String>() //该省的城市列表（第二级）
            val Province_AreaList = ArrayList<ArrayList<String>>() //该省的所有地区列表（第三极）
            //下面是 需要调用的ID 参数
            val CityID = ArrayList<String>() //该省的城市列表（第二级）
            val Province_AreaID = ArrayList<ArrayList<String>>() //该省的所有地区列表（第
            for (c in 0 until jsonBean[i].cityList.size) { //遍历该省份的所有城市
// 城市 name add
                val CityName = jsonBean[i].cityList[c].name
                CityList.add(CityName) //添加城市
                // 城市 ID  add
                val cityid = java.lang.String.valueOf(jsonBean[i].cityList[c].name_id)
                CityID.add(cityid)
                // 地区 name
                val City_AreaList = ArrayList<String>() //该城市的所有地区列表
                // 地区 ID
                val City_AreaID = ArrayList<String>() //该城市的所有地区列表
                //如果无地区数据，建议添加空字符串，防止数据为null 导致三个选项长度不匹配造成崩溃
                if (jsonBean[i].cityList[c].area == null
                        || jsonBean[i].cityList[c].area.size == 0) {
                    City_AreaList.add("")
                    City_AreaID.add("")
                } else {
                    for (d in 0 until jsonBean[i].cityList[c].area.size) { //该城市对应地区所有数据
// 地区 name add
                        val AreaName = jsonBean[i].cityList[c].area[d]
                        City_AreaList.add(AreaName) //添加该城市所有地区数据
                        // 地区 id add
                        val AreaID = jsonBean[i].cityList[c].area_id[d]
                        City_AreaID.add(AreaID) //添加该城市所有地区数据
                    }
                }
                Province_AreaList.add(City_AreaList) //添加该省所有地区数据
                Province_AreaID.add(City_AreaID) //添加该省所有地区数据
            }
            /**
             * 添加城市数据
             */
            options2Items.add(CityList)
            index2Items.add(CityID)
            /**
             * 添加地区数据
             */
            options3Items.add(Province_AreaList)
            index3Items.add(Province_AreaID)
        }
        mHandler.sendEmptyMessage(MSG_LOAD_SUCCESS)
    }


    /**
     * <P>使用gson 解析</P>
     *
     * @param result
     * @return
     */
    fun parseData(result: String?): ArrayList<JsonBean> { //Gson 解析
        var detail = ArrayList<JsonBean>()
        try { //含ID 的解析
            val gson = Gson()
            val jsonBeen = gson.fromJson<ArrayList<JsonBean>>(result, object : TypeToken<ArrayList<JsonBean?>?>() {}.type)
            detail = jsonBeen
        } catch (e: Exception) {
            e.printStackTrace()
            mHandler.sendEmptyMessage(MSG_LOAD_FAILED)
        }
        return detail
    }

    override fun onDestroy() {
        super.onDestroy()
        mHandler.removeCallbacksAndMessages(null)
    }
}